Protect against recursion via gtk_container_remove(). (#459561, Christian
authorMatthias Clasen <mclasen@redhat.com>
Tue, 24 Jul 2007 03:54:16 +0000 (03:54 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Tue, 24 Jul 2007 03:54:16 +0000 (03:54 +0000)
2007-07-23  Matthias Clasen  <mclasen@redhat.com>

        * gtk/gtktooltip.c (gtk_tooltip_set_custom): Protect against
        recursion via gtk_container_remove().  (#459561, Christian Persch)
        (gtk_tooltip_window_hide): Simplify.

svn path=/trunk/; revision=18534

ChangeLog
gtk/gtktooltip.c

index 0cb397c02f81c7a37956874fe4c1bb007ffdde14..114d9bb85c95371d4a76cd2428b98000bd797022 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2007-07-23  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtktooltip.c (gtk_tooltip_set_custom): Protect against
+       recursion via gtk_container_remove().  (#459561, Christian Persch)
+       (gtk_tooltip_window_hide): Simplify.
+
        * tests/testtooltips.c: Add code to test gtk_tooltip_set_custom()
 
 2007-07-23  Christian Persch  <chpe@gnome.org>
index d60829df31cdd44e96d32b39a1794bcdf7613771..2d60b7c65dc760a303d10456ed3d9f8157206fd2 100644 (file)
@@ -314,9 +314,14 @@ gtk_tooltip_set_custom (GtkTooltip *tooltip,
 
   if (tooltip->custom_widget)
     {
-      gtk_container_remove (GTK_CONTAINER (tooltip->box),
-                           tooltip->custom_widget);
-      g_object_unref (tooltip->custom_widget);
+      GtkWidget *custom = tooltip->custom_widget;
+      /* Note: We must reset tooltip->custom_widget first, 
+       * since gtk_container_remove() will recurse into 
+       * gtk_tooltip_set_custom()
+       */
+      tooltip->custom_widget = NULL;
+      gtk_container_remove (GTK_CONTAINER (tooltip->box), custom);
+      g_object_unref (custom);
     }
 
   if (custom_widget)
@@ -326,8 +331,6 @@ gtk_tooltip_set_custom (GtkTooltip *tooltip,
       gtk_container_add (GTK_CONTAINER (tooltip->box), custom_widget);
       gtk_widget_show (custom_widget);
     }
-  else
-    tooltip->custom_widget = NULL;
 }
 
 /**
@@ -427,8 +430,7 @@ gtk_tooltip_window_hide (GtkWidget *widget,
 {
   GtkTooltip *tooltip = GTK_TOOLTIP (user_data);
 
-  if (tooltip->custom_widget)
-    gtk_tooltip_set_custom (tooltip, NULL);
+  gtk_tooltip_set_custom (tooltip, NULL);
 }
 
 /* event handling, etc */